
#ifndef _PLATEAU_H
#define _PLATEAU_H

/**
 * @file Plateau.h
 * @brief Contient la structure Plateau et ses fonctions
 * @details liste des fonctions pour le module Plateau
 * @version 1.0
 * @date 2013/05/16
*/
#include "case.h"
#include "ListeTemp.h"


/**
 * @struct Plateau structure plateau
 * @brief Structure Plateau
 * @details	la structure contient: un tableau de Case, et deux entiers etant le niveau du plateau et l'indice des cases.
 * @param niveau niveau du plateau
 * @param num_case l'indice des cases
 * @param tab le tableau qui contient les cases
*/
typedef struct
{
    int niveau;
    int num_case;
    Case * tab;
} Plateau;

/**
 * @brief initPlateau initialise niveau et num_case  puis alloue le tableau de 35 cases.
 * @param [in-out] Plateau *pPlat  Plateau a initialiser.
 * @return none
*/
void initPlateau(Plateau *pPlat, const int);

/**
 * @brief creerPlateau alloue un Plateau et fais appel a initPlateau.
 * @param [in] i le nombre de case que contiendera le Plateau.
 * @param [in] le nombre de joueur.
 * @return Plateau * le Plateau creer.
*/
Plateau * creerPlateau(const int, const int);
/**
 * @brief liberePlateau libere le tableau de cases et met le pointeur a NULL.
 * @param [in-out] *pPlat  Plateau a liberer
 * @return none
*/
void liberePlateau(Plateau *pPlat);
/**
 * @brief detruitPlateau fais appel a liberePlateau et met le pointeur a NULL.
 * @param [in] **ppPlat le Plateau a detruire.
 * @return none
*/
void detruitPlateau(Plateau **ppPlat);
/**
 * @brief set_niveau mutateur pour modifier le niveau du PLateau.
 * @param [in-out] *pPlat Plateau a modifier
 * @param [in] niveau le niveau auquel on veut faire passer le Plateau
 * @return none
*/
void set_niveau(Plateau *pPlat,int niveau);
/**
 * @brief get_niveau accesseur pour acceder au niveau du PLateau.
 * @param [in] *pPlat Plateau concerné
 * @return pPlat->niveau le niveau du Plateau
*/
int get_niveau(const Plateau *pPlat);
/**
 * @brief get_capacitePlat accesseur pour acceder au nombre de cases dans le Plateau.
 * @param [in] *pPlat Plateau concerné
 * @return pPlat->num_case le nombre de cases dans Plateau
*/
int get_capacitePlat(Plateau *pPlat);
/**
 * @brief get_posecase accesseur pour acceder a la position d'une case dans le Plateau
 * @param [in] *pPlat Plateau concerné
 * @param [in] *pCase Case concerné
 * @return i l'indice de la case dans le tableau
*/
int get_posecase(const Plateau *pPlat,const Case * pCase);
/**
 * @brief set_case mutateur pour modifier une case du Plateau
 * @param [in-out] *pPlat Plateau concerné
 * @param [in] pCase Case a mettre dans le plateau
 * @param [in] num_case l'indice de la case a remplacer dans le tableau
 * @return none
*/
void set_case(Plateau *pPlat,int num_case,Case pCase);
/**
 * @brief get_case accesseur pour acceder a une case du plateau
 * @param [in] *pPlat Plateau concerné
 * @param [in] num_case l'indice de la case concerné dans le tableau
 * @return &pPlat->tab[num_case] la case a l'indice passé en parametre
*/
Case * get_case(const Plateau *pPlat, int num_case);
/**
 * @brief repartirCase repartis les cases selon leurs type sur le Plateau.
 * @param [in-out] *pPlat Plateau concerné
 * @return void
*/
void repartirCase(Plateau *);
/**
 * @brief verifPosition verifie si le joueur est tjr sur le plateau.
 * @param [in] taille la taille du plateau.
 * @param [in] positionf la position du joueur a l'instant.
 * @return bool 2 si le joueur est sur la derniere case ,1 si il l'a depassé et 0 sinon.
*/
bool verifPosition(const int , const int );
/**
 * @brief verifCredit verifie le score du joueur.
 * @param [in] total le total des points que doit avoir le joueur.
 * @param [in] score son score a l'instant.
 * @return bool retourn 1 si (score >= total), 0 sinon.
*/
bool verifCredit(const int total, const int score);
/**
 * @brief repartirQuest repartis les questions sur les cases du type "triche" du Plateau.
 * @param [in-out] *pPlat Plateau concerné
 * @param [in] *liste la liste de questions.
 * @return void
*/
void repartirQuest(Plateau *, ListeTempQ *);
/**
 * @brief platTestRegression fais appel a toutes les fonctions du module Plateau et effectue des Tests.
 * @return void
*/
void platTestRegression();

#endif
